package mx.gob.imss.reiman.clientes.model;

import java.util.ArrayList;
import java.util.List;

//TODO: 
public class LabResult {
	private String NUM_FOLIO_ORDEN = "";
	private String cveIdee = "";
	private String CVE_PRESUPUESTAL = "";
	private String FECHA_HORA_ELAB = "";
	private String APELLIDOP_JEFE = "";
	private String APELLIDOM_JEFE = "";
	private String NOMBRE_JEFE = "";
	private String MAT_JEFE = "";
	private String CED_JEFE = "";
	private String CVE_SERV_CONTRATDO = "";
	private String RFC_PROVEEDOR = "";
	private String ID_APLICACION = "";
	private String TIPO_MENSAJE = "";
	private String NUM_CONTRATO = "";
	private List<String> errores = new ArrayList<String>();
	private List<Estudio> estudios = new ArrayList<Estudio>();
	private Integer selectedComponent = 0;
	private List<Integer> idsEstudios = new ArrayList<Integer>();
	private List<Prueba> pruebas = new ArrayList<Prueba>();
	private int seqEstudios = 0;

	public String getNUM_FOLIO_ORDEN() {
		return NUM_FOLIO_ORDEN;
	}

	public void setNUM_FOLIO_ORDEN(String nUMFOLIOORDEN) {
		NUM_FOLIO_ORDEN = nUMFOLIOORDEN;
	}

	public String getCveIdee() {
		return cveIdee;
	}

	public void setCveIdee(String cveIdee) {
		this.cveIdee = cveIdee;
	}

	public String getCVE_PRESUPUESTAL() {
		return CVE_PRESUPUESTAL;
	}

	public void setCVE_PRESUPUESTAL(String cVEPRESUPUESTAL) {
		CVE_PRESUPUESTAL = cVEPRESUPUESTAL;
	}

	public String getFECHA_HORA_ELAB() {
		return FECHA_HORA_ELAB;
	}

	public void setFECHA_HORA_ELAB(String fECHAHORAELAB) {
		FECHA_HORA_ELAB = fECHAHORAELAB;
	}

	public String getAPELLIDOP_JEFE() {
		return APELLIDOP_JEFE;
	}

	public void setAPELLIDOP_JEFE(String aPELLIDOPJEFE) {
		APELLIDOP_JEFE = aPELLIDOPJEFE;
	}

	public String getAPELLIDOM_JEFE() {
		return APELLIDOM_JEFE;
	}

	public void setAPELLIDOM_JEFE(String aPELLIDOMJEFE) {
		APELLIDOM_JEFE = aPELLIDOMJEFE;
	}

	public String getNOMBRE_JEFE() {
		return NOMBRE_JEFE;
	}

	public void setNOMBRE_JEFE(String nOMBREJEFE) {
		NOMBRE_JEFE = nOMBREJEFE;
	}

	public String getMAT_JEFE() {
		return MAT_JEFE;
	}

	public void setMAT_JEFE(String mATJEFE) {
		MAT_JEFE = mATJEFE;
	}

	public String getCED_JEFE() {
		return CED_JEFE;
	}

	public void setCED_JEFE(String cEDJEFE) {
		CED_JEFE = cEDJEFE;
	}

	public String getCVE_SERV_CONTRATDO() {
		return CVE_SERV_CONTRATDO;
	}

	public void setCVE_SERV_CONTRATDO(String cVESERVCONTRATDO) {
		CVE_SERV_CONTRATDO = cVESERVCONTRATDO;
	}

	public String getRFC_PROVEEDOR() {
		return RFC_PROVEEDOR;
	}

	public void setRFC_PROVEEDOR(String rFCPROVEEDOR) {
		RFC_PROVEEDOR = rFCPROVEEDOR;
	}

	public String getID_APLICACION() {
		return ID_APLICACION;
	}

	public void setID_APLICACION(String iDAPLICACION) {
		ID_APLICACION = iDAPLICACION;
	}

	public String getTIPO_MENSAJE() {
		return TIPO_MENSAJE;
	}

	public void setTIPO_MENSAJE(String tIPOMENSAJE) {
		TIPO_MENSAJE = tIPOMENSAJE;
	}

	public String getNUM_CONTRATO() {
		return NUM_CONTRATO;
	}

	public void setNUM_CONTRATO(String nUMCONTRATO) {
		NUM_CONTRATO = nUMCONTRATO;
	}

	public List<Estudio> getEstudios() {
		return estudios;
	}

	public void setEstudios(List<Estudio> estudios) {
		this.estudios = estudios;
	}

	public Integer getSelectedComponent() {
		return selectedComponent;
	}

	public void setSelectedComponent(Integer selectedComponent) {
		this.selectedComponent = selectedComponent;
	}

	public List<Integer> getIdsEstudios() {
		return idsEstudios;
	}

	public void setIdsEstudios(List<Integer> idsEstudios) {
		this.idsEstudios = idsEstudios;
	}

	public List<Prueba> getPruebas() {
		return pruebas;
	}

	public void setPruebas(List<Prueba> pruebas) {
		this.pruebas = pruebas;
	}

	public int getSeqEstudios() {
		return ++seqEstudios;
	}

	public void setSeqEstudios(int seqEstudios) {
		this.seqEstudios = seqEstudios;
	}

	public List<String> getErrores() {
		return errores;
	}

	public void setErrores(List<String> errores) {
		this.errores = errores;
	}

	public void addError(String error) {
		errores.add(error);
	}

	public String getXML() {
		StringBuffer xml = new StringBuffer();
		System.out.println("- Dentro de getXML");
		xml.append("<labResult xmlns=\"http://www.openuri.org/\" > \n ");
		xml.append("	<GovTalkMessage xmlns=\"urn:hl7-org:v3\"> \n");
		xml.append("	<EnvelopeVersion>2.0</EnvelopeVersion> \n");
		xml.append("  <Header> \n");
		xml.append("   <MessageDetails> \n");
		xml.append("    <Class>POLB_RM004000</Class> \n");
		xml.append("    <Qualifier>HL7Message</Qualifier> \n");
		xml.append("  	<Function>submit</Function> \n");
		xml.append("	<TransactionID/>");
		xml.append("	<CorrelationID></CorrelationID>");
		xml.append("	<GatewayTimestamp>01:01:01 2011/01/01</GatewayTimestamp>");
		xml.append("   </MessageDetails>");
		xml.append("   <SenderDetails>");
		xml.append("		<SenderIP>11.254.16.122</SenderIP>");
		xml.append("		<Authentication>");
		xml.append("			<Method>clear</Method>");
		xml.append("			<Value/>");
		xml.append("		</Authentication>");
		xml.append("   </SenderDetails>");
		xml.append("   <ReceiverDetails>");
		xml.append("	<SenderIP>11.254.16.122</SenderIP>");
		xml.append("	<Authentication>");
		xml.append("		<Method>clear</Method>");
		xml.append("		<Value/>");
		xml.append("	</Authentication>");
		xml.append("   </ReceiverDetails>");
		xml.append("  </Header>");
		xml.append("	<GovTalkDetails> \n");
		xml.append("		<TargetDetails> \n");
		xml.append("			<Organization>IMSS</Organization> \n");
		xml.append("		</TargetDetails> \n");
		xml.append("	</GovTalkDetails> \n");
		xml.append("	<Body> \n");
		xml.append("<POLB_MT004000 xmlns='urn:hl7-org:v3' xmlns:xsi='http://www.w3.org/2002/XMLSchema-instance' xsi:schemaLocation='urn:hl7-org:v3 POLB_HD004000.xsd'>");
		xml.append("<id root='2.16.840.1.113883.19.3.2409' extension='"
				+ this.NUM_FOLIO_ORDEN + "' displayable='true'/>");
		for (Estudio estudio : estudios) {
			xml.append("<specimen>");
			xml.append("	<exposedEntity>");
			System.out.println("/////////// Dentro de LabResult cve_EStudio "
					+ estudio.getCVE_LOINC_ESTUDIO());
			xml.append("		<id root='2.16.840.1.113883.19.3.2409' extension='"
					+ estudio.getCVE_LOINC_ESTUDIO() + "' displayable='true'/>");
			if (estudio.getOBSERVACIONES_RESULTADO() != null
					&& !"".equals(estudio.getOBSERVACIONES_RESULTADO())) {
				xml.append("	<code code='"
						+ estudio.getOBSERVACIONES_RESULTADO()
						+ "' codeSystem='2.16.840.1.113883.5.111' codeSystemName='RoleCode' displayName='Display name'/>");
			}
			xml.append("		<effectiveTime value='"
					+ estudio.getFECHA_HORA_VAL_RESULTADO() + "'/>");
			for (Prueba p : estudio.getPruebas()) {
				xml.append("	<exposedMaterial>");
				xml.append("		<id root='2.16.840.1.113883.19.3.2409' extension='"
						+ p.getCVE_LOINC_PRUEBA() + "' displayable='true'/>");
				// Se concatena el n�mero de toma y valor de referencia
				if (p.getNUM_TOMA() != null && !"".equals(p.getNUM_TOMA())) {
					if (p.getVALOR_REF_TEXTO() != null
							&& !"".equals(p.getVALOR_REF_TEXTO())) {
						xml.append("<code code='"
								+ p.getNUM_TOMA()
								+ "|"
								+ p.getVALOR_REF_TEXTO()
								+ "' codeSystem='2.16.840.1.113883.19.1.16040' codeSystemName='EntityCode'/>");
					} else {
						xml.append("<code code='"
								+ p.getNUM_TOMA()
								+ "' codeSystem='2.16.840.1.113883.19.1.16040' codeSystemName='EntityCode'/>");
					}
				}
				xml.append("		<quantity value='" + p.getVALOR_PRUEBA()
						+ "' unit='[in_i]'/>");
				xml.append("		<name use='" + p.getUNIDAD_MEDIDA() + "'/>");
				if (p.getOBSERVACION_RESULTADO() != null
						&& !"".equals(p.getOBSERVACION_RESULTADO())) {
					xml.append("	<desc mediaType='text/plain'>"
							+ p.getOBSERVACION_RESULTADO() + "</desc>");
				}
				if (p.getNUM_SERIE_EQUIPO() != null
						&& !"".equals(p.getNUM_SERIE_EQUIPO())) {
					xml.append("	<statusCode code='" + p.getNUM_SERIE_EQUIPO()
							+ "'/>");
				}
				xml.append("		<riskCode code='"
						+ p.getINTERPRETACION()
						+ "' codeSystem='2.16.840.1.113883.5.46' codeSystemName='EntityRisk' displayName='Display name'/>");
				if (p.getVALOR_MIN_REF() != null
						&& !"".equals(p.getVALOR_MIN_REF())) {
					if (p.getVALOR_MAX_REG() != null
							&& !"".equals(p.getVALOR_MAX_REG())) {
						xml.append("	<handlingCode code='"
								+ p.getVALOR_MIN_REF()
								+ "|"
								+ p.getVALOR_MAX_REG()
								+ "' codeSystem='2.16.840.1.113883.5.42' codeSystemName='EntityHandling' displayName='Display name'/>");
					}
				}
				xml.append("	</exposedMaterial>");
			}
			xml.append("		<exposingPerson>");
			xml.append("			<id root='2.16.840.1.113883.19.3.2409' extension='"
					+ estudio.getMAT_QUIMICO() + "' displayable='true'/>");
			if (estudio.getCED_QUIMICO() != null
					&& !"".equals(estudio.getCED_QUIMICO())) {
				xml.append("		<code code='"
						+ estudio.getCED_QUIMICO()
						+ "' codeSystem='2.16.840.1.113883.19.1.16040' codeSystemName='EntityCode'>");
				xml.append("		<originalText>The original text.</originalText>");
				xml.append("		<translation code='CODE' codeSystem='2.16.840.1.113883.5' codeSystemName='CodeSysName' codeSystemVersion='CodeSysVersion' displayName='Display name'/>");
				xml.append("		</code>");
			}
			xml.append("			<name use='" + estudio.getNOMBRE_QUIMICO() + "'>");
			xml.append("				<given>" + estudio.getAPELLIDOM_QUIMICO()
					+ "</given>");
			xml.append("				<family>" + estudio.getAPELLIDOP_QUIMICO()
					+ "</family>");
			xml.append("			</name>");
			xml.append("		</exposingPerson>");
			xml.append("	</exposedEntity>");
			xml.append("</specimen>");
		}
		xml.append("<recordTarget>");
		xml.append("	<patient>");
		xml.append("		<id root='2.16.840.1.113883.19.3.2409' extension='"
				+ this.cveIdee + "' displayable='true'/>");
		xml.append("	</patient>");
		xml.append("</recordTarget>");
		xml.append("<verifier> ");
		xml.append("	<time value='" + this.FECHA_HORA_ELAB + "'/>");
		xml.append("	<assignedEntity>");
		xml.append("		<confidentialityCode code='"
				+ this.MAT_JEFE
				+ "' codeSystem='2.16.840.1.113883.5.25' codeSystemName='Confidentiality' displayName='Display name'/>");
		xml.append("		<representedPublicInstitution>");
		xml.append("			<code code='"
				+ this.CVE_PRESUPUESTAL
				+ "' codeSystem='2.16.840.1.113883.19.1.16040' codeSystemName='EntityCode'/>");
		xml.append("		</representedPublicInstitution>");
		xml.append("		<assignedPerson>");
		if (this.CED_JEFE != null && !"".equals(this.CED_JEFE)) {
			xml.append("		<id root='2.16.840.1.113883.19.3.2409' extension='"
					+ this.CED_JEFE + "' displayable='true'/>");
		}
		xml.append("			<name use='" + this.NOMBRE_JEFE + "'>");
		xml.append("		<given>" + this.APELLIDOM_JEFE + "</given>");
		xml.append("				<family>" + this.APELLIDOP_JEFE + "</family>");
		xml.append("			</name>");
		xml.append("		</assignedPerson>");
		xml.append("	</assignedEntity>");
		xml.append("</verifier>");
		xml.append("<subjectOf>");
		xml.append("	<controlActEvent>");
		xml.append("		<id root='2.16.840.1.113883.19.3.2409' extension='"
				+ this.TIPO_MENSAJE + "' displayable='true'/>");
		xml.append("		<priorityCode code='"
				+ this.CVE_SERV_CONTRATDO
				+ "' codeSystem='2.16.840.1.113883.5.7' codeSystemName='ActPriority' displayName='Display name'/>");
		xml.append("		<confidentialityCode code='"
				+ this.ID_APLICACION
				+ "' codeSystem='2.16.840.1.113883.5.25' codeSystemName='Confidentiality' displayName='Display name'/>");
		xml.append("		<uncertaintyCode code='"
				+ this.NUM_CONTRATO
				+ "' codeSystem='2.16.840.1.113883.5.25' codeSystemName='Confidentiality' displayName='Display name'/>");
		xml.append("		<reasonCode code='"
				+ this.RFC_PROVEEDOR
				+ "' codeSystem='2.16.840.1.113883.5.8' codeSystemName='ActReason' displayName='Display name'/>");
		xml.append("	</controlActEvent>");
		xml.append("</subjectOf>");
		xml.append("</POLB_MT004000>");
		xml.append("	</Body> \n");
		xml.append("</GovTalkMessage>");
		xml.append("</labResult>");
		return xml.toString();
	}
}
